package com.mazaiting.mybatisplus.encrypt.utils;

import com.mazaiting.mybatisplus.encrypt.FieldEncrypt;
import org.apache.ibatis.mapping.SqlCommandType;
import org.springframework.util.StringUtils;

import java.util.Objects;

/**
 * 加密器工具类
 * @author danghailiang
 */
public class MybatisPlusUtil {

    /**
     * 获取FieldEncrypt注解中的密钥
     * @param fieldEncrypt 注解
     * @param defaultKey  默认签名
     * @return 密钥
     */
    public static String getKey(FieldEncrypt fieldEncrypt, String defaultKey) {
        // 获取注解上的key值
        String key = fieldEncrypt.key();
        // 判断
        if (!StringUtils.hasLength(key)) {
            // 如果没有设置密钥则使用默认密钥
            return Objects.isNull(key) ? "" : defaultKey;
        }
        return key;
    }

    /**
     * 判断sql语句类型
     * @param parameter 参数
     * @param sqlCommandType 执行sql类型
     * @return 是否符合
     */
    public static boolean encryptionRequired(Object parameter, SqlCommandType sqlCommandType) {
        // 判断sqlCommandType类别 是否符合条件
        return (sqlCommandType == SqlCommandType.INSERT || sqlCommandType == SqlCommandType.UPDATE)
                // 判断参数是否符合条件
                && decryptionRequired(parameter);
    }

    /**
     * 判断对象类型 除了字符串，都返回为false
     * @param parameter 被加密参数
     * @return  是否符合
     */
    public static boolean decryptionRequired(Object parameter) {
        return !(Objects.isNull(parameter) || parameter instanceof Double || parameter instanceof Integer
                || parameter instanceof Long || parameter instanceof Short || parameter instanceof Float
                || parameter instanceof Boolean || parameter instanceof Character
                || parameter instanceof Byte);
    }
}
